NumPy tutorial

NumPy (Numerical Python) je Pythonovská knižnica, ktorá je určená pre prácu s viacrozmernými homogennými poliami.

Ďalšie informácie:

V tomto kurze budeme pracovať výlučne s jednorozmernými poliami.

Modul numpy

Doporučená konvencia pre importovanie modulu numpy:

>>> import numpy as np
In [1]:
import numpy as np

Interaktívna dokumentácia

Príklady:

>>> np.info(np.array)
>>> np.array?
>>> np.array*?
>>> np.lookfor('array')

Konštrukcia poľa

Tu sa zoznámime s dvoma základnými spôsobmi konštrukcie poľa typundarray.

Manuálna konštrukcia poľa

Z nejakého kontajneru, napr. zo štandartného pythonovského poľa (list):

>>> A = np.array([0, 1, 2, 3]) # testovacie pole
>>> A
>>> print(A)
>>> len(A)
>>> type(A)
>>> A.dtype                    # atribút: typ prvkov v poli

Funkcie pre konštrukciu poľa

Funkcia np.arange vytvorí pole typu ndarray analogickým spôsobom ako pythonovský generátor range.

>>> np.arange(10)      # pole 10 čísel od 0 po 9
>>> np.arange(1, 9, 2) # argumenty: od, do (vylučujúce), krok

Je to obyčajná funkcia, nie generátor!

Funkcia np.linspace vytvorí pole typu ndarray s prvkami, ktoré tvoria homogénne delenie uzavretého intervalu.

>>> np.linspace(0, 10, 100+1) # argumenty: od, do (vrátane), počet prvkov (štandardne 50)

Funkcie np.zeros a np.ones vytvoria polia typu ndarray zo samých núl resp. zo samých jednotiek.

>>> np.zeros(10) # argument: dĺžka poľa
>>> np.ones(10)  # argument: dĺžka poľa

Funkcia np.random.randint vytvorí pole typu ndarray z náhodne vygenerovaných čísel.

>>> np.random.randint(1, 100, size=10) # argumenty: od, do (vylučujúce), počet prvkov

Operácie po prvkoch

V tejto časti sa zoznámime s funkciami, ktoré umožňujú operovať na poliach typu ndarray po prvkoch. Tieto operácie sa nazývajú univerzálne funkcie (ufunc).

>>> np.lookfor('ufunc')
>>> np.info('ufunc')

Skalárne operácie

Binárne operácie, kde jeden argument je pole typu ndarray a druhý argument je skalár.

>>> A = np.array([1, 2, 3, 4]) # testovacie pole
>>> A + 2
>>> A - 2
>>> A * 2
>>> A / 2
>>> A ** 2
>>> 2 + A
>>> 2 - A
>>> 2 * A
>>> 2 / A
>>> 2 ** A
>>> A ** 2 + 2 * A + 1

Aritmetické operácie

Binárne operácie, kde oba argumenty sú polia typu ndarray.

>>> A = np.array([1, 2, 3, 4]) # testovacie pole
>>> B = np.array([8, 7, 6, 5]) # testovacie pole
>>> A + B
>>> A - B
>>> A * B
>>> A / B
>>> A ** B
>>> A * A + 2 * A * B + B * B

Porovnávanie

Výsledkom porovnania je boolovské pole typu ndarray. Jeden argument je pole typu ndarray a druhý argument môže byť skalár.

>>> A = np.array([1, 9, 4, 6, 3, 8]) # testovacie pole
>>> A < 5
>>> A % 2 == 0
>>> B = np.array([2, 8, 4, 7, 3, 6]) # iné testovacie pole
>>> A == B
>>> A <= B

Logické operácie

Výrokovologické operácie aplikované na boolovské polia typu ndarray.

>>> A = np.random.randint(1, 100, size=10) # testovacie pole
>>> print(A)
>>> ~(A < 50)                              # negácia
>>> (A < 50) & (A % 2 == 0)                # konjunkcia
>>> (A < 50) | (A % 2 == 0)                # disjunkcia

Exponenciálne funkcie

>>> A = np.array([0, 1, 2, 3, 4]) # testovacie pole
>>> np.exp(A)                  # exponenciálna funkcia s prirodzeným základom
>>> np.exp2(A)                 # exponenciálna funkcia so základom 2

Logaritmické funkcie

>>> A = np.array([1, np.exp(1), np.exp(2), np.exp(3), np.exp(4)]) # testovacie pole
>>> np.log(A)                                                     # prirodzený logaritmus
>>> B = np.array([1, 2, 4, 8, 16])                                # iné testovacie pole
>>> np.log2(B)                                                    # logaritmus pri základe 2

Goniometrické funkcie

>>> A = np.array([0, np.pi/4, np.pi/2])  # testovacie pole
>>> np.sin(A)                            # sínus
>>> np.cos(A)                            # kosínus
>>> B = np.array([-np.pi/4, 0, np.pi/4]) # iné testovacie pole
>>> np.tan(B)                            # tangens

Cyklometrické funkcie

>>> A = np.array([0, 1/np.sqrt(2), 1]) # testovacie pole
>>> np.arcsin(A)                       # arkussínus
>>> np.arccos(A)                       # arkuskosínus
>>> B = np.array([-1, 0, 1])           # iné testovacie pole
>>> np.arctan(B)                       # arkustangens

Indexovanie

Polia typu ndarray môžme indexovať podobne ako štandartné pythonovské polia (list):

>>> A = np.random.randint(1, 100, size=10) # testovacie pole
>>> print(A)
>>> A[0]
>>> A[2]
>>> A[-1]
>>> A[0] = 111                             # priradenie
>>> A

Rezy

Rezy nad poliami typu ndarray majú podobnú syntax ako pre štandartné pythonovské polia (list):

>>> A = np.random.randint(1, 100, size=10) # testovacie pole
>>> print(A)
>>> A[2:9:3]                               # argumenty: od, do (vylučujúce), krok
>>> A[:4]
>>> A[1:3]
>>> A[::2]
>>> A[3:]
>>> A[5:] = -1                             # priradenie do rezu
>>> A
>>> B = np.random.randint(1, 100, size=5)  # iné testovacie pole
>>> print(B)
>>> A[5:] = B[::-1]                        # priradenie do rezu
>>> A

Maskovanie

Pre rezy môžme použiť masky. Sú to boolovské polia typu ndarray.

>>> A = np.random.randint(1, 100, size=20) # testovacie pole
>>> print(A)
>>> A[(A < 50) & (A % 2 == 0)]             # extrakcia podpoľa pomocou masky
>>> A[(A < 50) & (A % 2 == 0)] = 222       # priradenie do rezu určeného maskou
>>> print(A)

Ďalšie operácie

Funkcia np.min vráti najmenší prvok v neprázdnom poli typu ndarray.

>>> A = np.random.randint(1, 100, size=10) # testovacie pole
>>> print(A)
>>> np.min(A)

Funkcia np.max vráti najväčší prvok v neprázdnom poli typu ndarray.

>>> A = np.random.randint(1, 100, size=10) # testovacie pole
>>> print(A)
>>> np.max(A)